package com.yangzhe.algorithm.c030;

// 不用任何判断语句和比较操作，返回两个数的最大值
// 测试链接 : https://www.nowcoder.com/practice/d2707eaf98124f1e8f1d9c18ad487f76
public class Code02_GetMaxWithoutJudge_NewCoder {
	public static void main(String[] args) {
		Code02_GetMaxWithoutJudge_NewCoder test = new Code02_GetMaxWithoutJudge_NewCoder();
		System.out.println(test.getMax(1, 2));
		System.out.println(test.getMax(2, 1));
		System.out.println(test.getMax(1, 1));
	}

	/**
	 * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
	 *
	 * 获取最大值
	 * @param a int整型
	 * @param b int整型
	 * @return int整型
	 */
	public int getMax (int a, int b) {
		int diff = a - b;
		int signA = getSign(a);
		int signB = getSign(b);
		int signDiff = getSign(diff);

		// 符号不一样 1 符号一样 0
		int diffSign = signA ^ signB;
		// 符号不一样 0 符号一样 1
		int sameSign = flip(diffSign);

		int returnA = sameSign * signDiff + diffSign * signA;
		int returnB = flip(returnA);

		return a * returnA + b * returnB;
	}

	/**
	 * 获取符号 负数 0 正数 1
	 */
	public int getSign(int value) {
		// 带符号右移之后，负数 1 正数 0
		// 反转后 负数 0 正数 1
		return flip(value >>> 31);
	}

	/**
	 * 翻转第一位 数字
	 */
	public int flip(int value) {
		return value ^ 1;
	}
}
